////package com.scnu.hachimi.tool;
////
////import javazoom.jl.player.Player;
////
////import java.io.File;
////import java.io.FileInputStream;
////import java.io.InputStream;
////import java.util.HashMap;
////import java.util.Map;
////
////public class LoopingMp3Player {
////
////    // 存储背景音乐的映射
////    private Map<Integer, String> bgmMap;
////    private Player player;
////    private InputStream inputStream;
////    private Thread thread;
////
////    public LoopingMp3Player() {
////        bgmMap = new HashMap<>();
////    }
////
////    // 添加背景音乐
////    public void addBGM(int key, String filePath) {
////        bgmMap.put(key, filePath);
////    }
////
////    // 播放指定的背景音乐
////    public void playBGM(int key) {
////        String filePath = bgmMap.get(key);
////        if (filePath == null) {
////            System.out.println("指定的背景音乐不存在");
////            return;
////        }
////        playMp3File(filePath);
////    }
////
////    // 播放音频文件
////    private void playMp3File(String filePath) {
////        thread = new Thread(() -> {
////            try {
////                boolean loop = true;
////                while (loop) {
////                    // 每次播放都重新打开输入流并创建 Player
////                    inputStream = new FileInputStream(new File(filePath));
////                    player = new Player(inputStream);
////                    player.play();  // 播放一次
////                    player.close(); // 关闭 Player
////                    inputStream.close(); // 关闭流
////
////                    // 控制循环的条件判断可在此添加
////                    // loop = checkIfContinueLooping();
////                }
////            } catch (Exception e) {
////                e.printStackTrace();
////            }
////        });
////
////        thread.start();
////    }
////
////    public void stopBGM() {
////        thread.interrupt();
////
////        if (player != null) {
////            player.close();
////        }
////        if (inputStream != null) {
////            try {
////                inputStream.close();
////            } catch (Exception e) {
////                e.printStackTrace();
////            }
////        }
////
////    }
////
////    public static void main(String[] args) throws InterruptedException {
////        LoopingMp3Player player = new LoopingMp3Player();
////
////        // 添加背景音乐文件
////        player.addBGM(1, "bgm/Gaijin Entertainment,Jimmie Asche - Cloak and Dagger.wav");
////
////        // 根据传入的参数播放指定的背景音乐
////        int bgmKey = 1; // 您可以根据需要传入的参数来改变这个值
////        player.playBGM(bgmKey);
////
////        Thread.sleep(5000);
////
////        player.stopBGM();
////    }
////}
//
//package com.scnu.hachimi.tool;
//
//import javazoom.jl.player.Player;
//import java.io.File;
//import java.io.FileInputStream;
//import java.io.InputStream;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.concurrent.atomic.AtomicBoolean;
//
//public class LoopingMp3Player {
//
//    // 存储背景音乐的映射
//    private Map<Integer, String> bgmMap;
//    private volatile Player currentPlayer; // 使用 volatile 保证可见性
//    private Thread playThread;
//    private final AtomicBoolean isPlaying = new AtomicBoolean(false); // 线程安全的播放状态标志
//
//    public LoopingMp3Player() {
//        bgmMap = new HashMap<>();
//    }
//
//    // 添加背景音乐
//    public void addBGM(int key, String filePath) {
//        bgmMap.put(key, filePath);
//    }
//
//    // 播放指定的背景音乐
//    public void playBGM(int key) {
//        stopBGM(); // 先停止当前播放
//
//        String filePath = bgmMap.get(key);
//        if (filePath == null) {
//            System.out.println("指定的背景音乐不存在");
//            return;
//        }
//
//        isPlaying.set(true);
//        playThread = new Thread(() -> playMp3File(filePath));
//        playThread.start();
//    }
//
//    // 播放音频文件
//    private void playMp3File(String filePath) {
//        try {
//            while (isPlaying.get()) {
//                try (InputStream inputStream = new FileInputStream(new File(filePath))) {
//                    currentPlayer = new Player(inputStream);
//                    currentPlayer.play();  // 播放一次（阻塞方法）
//                } catch (Exception e) {
//                    // 当播放被中断时，会抛出异常
//                    if (!isPlaying.get()) {
//                        // 如果是主动停止，正常退出
//                        break;
//                    }
//                    e.printStackTrace();
//                }
//            }
//        } finally {
//            isPlaying.set(false);
//        }
//    }
//
//    // 立即停止播放
//    public void stopBGM() {
//        isPlaying.set(false); // 设置标志位停止循环
//
//        // 关闭当前播放器
//        if (currentPlayer != null) {
//            currentPlayer.close(); // 这会中断 play() 方法
//            currentPlayer = null;
//        }
//
//        // 中断线程（如果还在阻塞状态）
//        if (playThread != null && playThread.isAlive()) {
//            playThread.interrupt();
//            try {
//                playThread.join(100); // 等待线程结束
//            } catch (InterruptedException e) {
//                Thread.currentThread().interrupt();
//            }
//            playThread = null;
//        }
//    }
//
////    public static void main(String[] args) throws InterruptedException {
////        LoopingMp3Player player = new LoopingMp3Player();
////
////        // 添加背景音乐文件
////        player.addBGM(1, "bgm/Gaijin Entertainment,Jimmie Asche - Cloak and Dagger.wav");
////
////        // 播放 BGM
////        player.playBGM(1);
////
////        // 5秒后停止
////        Thread.sleep(5000);
////
////        player.playBGM(1);
////
////        System.out.println("BGM 已停止");
////    }
//}
//

package com.scnu.hachimi.tool;

import javazoom.jl.player.Player;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;

public class LoopingMp3Player {

    // 存储背景音乐的映射（改为存储资源路径）
    private Map<Integer, String> bgmMap;
    private volatile Player currentPlayer;
    private Thread playThread;
    private final AtomicBoolean isPlaying = new AtomicBoolean(false);

    public LoopingMp3Player() {
        bgmMap = new HashMap<>();
    }

    // 添加背景音乐（使用资源路径）
    public void addBGM(int key, String resourcePath) {
        bgmMap.put(key, resourcePath);
    }

    // 播放指定的背景音乐
    public void playBGM(int key) {
        stopBGM(); // 先停止当前播放

        String resourcePath = bgmMap.get(key);
        if (resourcePath == null) {
            System.out.println("指定的背景音乐不存在");
            return;
        }

        isPlaying.set(true);
        playThread = new Thread(() -> playMp3Resource(resourcePath));
        playThread.start();
    }

    // 播放音频资源（使用类加载器）
    private void playMp3Resource(String resourcePath) {
        try {
            while (isPlaying.get()) {
                try (InputStream inputStream = getClass().getResourceAsStream(resourcePath)) {
                    if (inputStream == null) {
                        System.err.println("资源未找到: " + resourcePath);
                        break;
                    }
                    currentPlayer = new Player(inputStream);
                    currentPlayer.play();  // 播放一次（阻塞方法）
                } catch (Exception e) {
                    // 当播放被中断时，会抛出异常
                    if (!isPlaying.get()) {
                        // 如果是主动停止，正常退出
                        break;
                    }
                    e.printStackTrace();
                }
            }
        } finally {
            isPlaying.set(false);
        }
    }

    // 立即停止播放
    public void stopBGM() {
        isPlaying.set(false); // 设置标志位停止循环

        // 关闭当前播放器
        if (currentPlayer != null) {
            currentPlayer.close(); // 这会中断 play() 方法
            currentPlayer = null;
        }

        // 中断线程（如果还在阻塞状态）
        if (playThread != null && playThread.isAlive()) {
            playThread.interrupt();
            try {
                playThread.join(100); // 等待线程结束
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            playThread = null;
        }
    }
}
